package com.tp2.etna.distribucion2.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.tp2.etna.distribucion2.constante.ConstanteDist2;
import com.tp2.etna.distribucion2.modelo.HojaRuta;
import com.tp2.etna.distribucion2.modelo.HojaRutaDetalle;

@Repository
public class HojaRutaDist2DAOImpl implements HojaRutaDist2DAO {

	@Autowired
    private DataSource dataSource;
	
	@Override
	public List<HojaRuta> getHojaRutas(Date fecha) {
		List<HojaRuta> hojaRutaList = new ArrayList<HojaRuta>();
		String query = " select hr.codigo as codigoHr,"
				+ " hr.numero as numeroHr,"
				+ " hr.fecha as fechaHr,"
				+ " hr.transporteDisponible as tieneTransporteHr,"
				+ " t.codigo as codigoTransporte,"
				+ " zd.codigo,"
				+ " zd.descripcion as zonaDespacho,"
				+ " t.placa as placa,"
					+ " (select  CONCAT_WS(' ',r.nombre,r.apellidoPaterno) "
					+ " from HojaRutaRecurso hrr inner join Recurso r"
					+ " on hrr.idRecurso = r.codigo"
					+ " inner join TipoRecurso tr"
					+ " on r.idTipoRecurso = tr.codigo"
					+ " where hrr.idHojaRuta = hr.codigo"
					+ " and tr.abreviatura = ?) as nombreCompleto "
				+ " from HojaRuta hr inner join EstadoHojaRuta ehr"
				+ "	on hr.idEstadoHojaRuta = ehr.codigo"
				+ " inner join ZonaDespacho zd"
				+ " on hr.idZonaDespacho = zd.codigo"
				+ " left join Transporte t"
				+ " on hr.idTransporte = t.codigo"
				+ "	where ehr.abreviatura in (?,?)"
				+ " and hr.fecha = curdate()"
				+ " and hr.fecha = "
				+ (fecha == null ? " curdate()" : "?");       
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setString(1, ConstanteDist2.TIPO_RECURSO_TRANSPORTISTA);
            ps.setString(2, ConstanteDist2.ESTADO_HOJA_RUTA_PENDIENTE);
            ps.setString(3, ConstanteDist2.ESTADO_HOJA_RUTA_TRANSP_ASIGNADO);

            rs = ps.executeQuery();
            while(rs.next()){
            	HojaRuta hojaRuta = new HojaRuta();
            	hojaRuta.setCodigo(rs.getInt("codigoHr"));
            	hojaRuta.setNumero(rs.getString("numeroHr"));
            	hojaRuta.setFecha(rs.getDate("fechaHr"));
            	String tieneTransporte = rs.getString("tieneTransporteHr");
            	hojaRuta.setTieneTransporte(tieneTransporte.equals("1") ? true : false);
            	hojaRuta.setZonaDespachoDesc(rs.getString("zonaDespacho"));
            	Integer codTransporte = rs.getInt("codigoTransporte");
            	if(codTransporte != 0){
            		hojaRuta.setTransportePlaca(rs.getString("placa"));
//            		Transporte transporte = new Transporte();
//                	transporte.setCodigo(codTransporte);
//                	transporte.setPlaca(rs.getString("placa"));
//                	hojaRuta.setTransporte(transporte);
            	}else{
            		hojaRuta.setTransportePlaca(" - ");
            	}
            	String nombreCompleto = rs.getString("nombreCompleto");
            	if(nombreCompleto != null){
            		hojaRuta.setTransportistaNombre(nombreCompleto);
//            		Recurso recurso= new Recurso();
//            		recurso.setNombre(nombreCompleto);
//            		hojaRuta.setTransportistas(new ArrayList<Recurso>());
//            		hojaRuta.getTransportistas().add(recurso);
            	}else{
            		hojaRuta.setTransportistaNombre(" - ");
            	}
            	hojaRutaList.add(hojaRuta);
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return hojaRutaList;
	}

	@Override
	public HojaRuta getHojaRutaById(int id) {
		HojaRuta hojaRuta = null;
		String query = " select hr.codigo as codigoHr,"
				+ " hr.numero as numeroHr,"
				+ " hr.fecha as fechaHr,"
				+ " hr.transporteDisponible as tieneTransporteHr,"
				+ " t.codigo as codigoTransporte,"
				+ " zd.codigo,"
				+ " zd.descripcion as zonaDespacho,"
				+ " t.placa as placa"
//					+ " (select  CONCAT_WS(' ',r.nombre,r.apellidoPaterno) "
//					+ " from HojaRutaRecurso hrr inner join Recurso r"
//					+ " on hrr.idRecurso = r.codigo"
//					+ " inner join TipoRecurso tr"
//					+ " on r.idTipoRecurso = tr.codigo"
//					+ " where hrr.idHojaRuta = hr.codigo"
//					+ " and tr.abreviatura = ?) as nombreCompleto "
				+ " from HojaRuta hr inner join EstadoHojaRuta ehr"
				+ "	on hr.idEstadoHojaRuta = ehr.codigo"
				+ " inner join ZonaDespacho zd"
				+ " on hr.idZonaDespacho = zd.codigo"
				+ " left join Transporte t"
				+ " on hr.idTransporte = t.codigo"
				+ "	where hr.codigo = ? ";
		
    	String query2 = "select hrd.nroItem as nroItem, "
    			+ " hrd.cubicaje as cubicaje,"
    			+ " hrd.peso as peso,"
    			+ " d.direccion as direccion,"
    			+ " c.nombre as cliente,"
    			+ " mt.descripcion as motivoTraslado"
    			+ " from HojaRutaDetalle hrd"
    			+ " inner join Entrega e"
    			+ " on hrd.idEntrega = e.codigo"
    			+ " inner join Cliente c"
    			+ " on e.idCliente = c.codigo"
    			+ " inner join Direccion d"
    			+ " on d.codigo = e.idDireccion"
    			+ " inner join MotivoTraslado mt"
    			+ " on e.idMotivoTraslado = mt.codigo"
    			+ " where hrd.idHojaRuta = ? ";
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, id);

            rs = ps.executeQuery();
            if(rs.next()){
            	hojaRuta = new HojaRuta();
            	hojaRuta.setCodigo(rs.getInt("codigoHr"));
            	hojaRuta.setNumero(rs.getString("numeroHr"));
            	hojaRuta.setFecha(rs.getDate("fechaHr"));
            	String tieneTransporte = rs.getString("tieneTransporteHr");
            	hojaRuta.setTieneTransporte(tieneTransporte.equals("1") ? true : false);
            	hojaRuta.setZonaDespachoDesc(rs.getString("zonaDespacho"));
            	hojaRuta.setTransportePlaca(rs.getString("placa"));
            	
            	rs.close();
            	ps.close();

                ps = con.prepareStatement(query2);
                ps.setInt(1, id);

                rs = ps.executeQuery();
            	List<HojaRutaDetalle> detalle = new ArrayList<HojaRutaDetalle>();
            	while(rs.next()){
            		HojaRutaDetalle hojaRutaDetalle = new HojaRutaDetalle();
            		hojaRutaDetalle.setNroItem(rs.getInt("nroItem"));
            		hojaRutaDetalle.setDestino(rs.getString("cliente"));
            		hojaRutaDetalle.setMotivoTraslado(rs.getString("motivoTraslado"));
            		hojaRutaDetalle.setDireccion(rs.getString("direccion"));
            		hojaRutaDetalle.setPeso(rs.getDouble("peso"));
            		hojaRutaDetalle.setCubicaje(rs.getDouble("cubicaje"));
            		detalle.add(hojaRutaDetalle);
            	}
            	hojaRuta.setDetalle(detalle);
//            	if(codTransporte != 0){
//            		hojaRuta.setTransportePlaca(rs.getString("placa"));
//            		Transporte transporte = new Transporte();
//                	transporte.setCodigo(codTransporte);
//                	transporte.setPlaca(rs.getString("placa"));
//                	hojaRuta.setTransporte(transporte);
//            	}else{
//            		hojaRuta.setTransportePlaca(" - ");
//            	}
//            	String nombreCompleto = rs.getString("nombreCompleto");
//            	if(nombreCompleto != null){
//            		hojaRuta.setTransportistaNombre(nombreCompleto);
//            		Recurso recurso= new Recurso();
//            		recurso.setNombre(nombreCompleto);
//            		hojaRuta.setTransportistas(new ArrayList<Recurso>());
//            		hojaRuta.getTransportistas().add(recurso);
//            	}else{
//            		hojaRuta.setTransportistaNombre(" - ");
//            	}
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return hojaRuta;
	}

}
